package cpm.atguigu.gulimall.seckill.scheduled;


import cpm.atguigu.gulimall.seckill.service.SeckillService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 秒杀商品的定时上架功能。
 * 每天晚上3点，上架最近三天需要秒杀的商品，已实现预告的功能
 *
 * /**
 *  * 秒杀商品的定时上架；
 *  *     每天晚上3点；上架最近三天需要秒杀的商品。
 *  *     当天00:00:00  - 23:59:59
 *  *     明天00:00:00  - 23:59:59
 *  *     后天00:00:00  - 23:59:59
 *      我们这一个类就是在写定时任务，没有任何业务可言。现在有个问题:我们想每天晚上3电脑上架商品
 *      但竟然会上架今晚零点到23点需要秒杀的商品。如果说有一个商品是要在今晚的零点准时秒杀，这该怎么办呢？
 *      事实上，我们会发现，这个类是一个定时任务，也就是说，今晚零点需要秒杀的商品，在昨天晚上也会上架。
 *      因此这个问题我们不需要担心，但由于出现了重复上架的问题
 *
 *  */
@Slf4j
@Service
public class SeckillSkuScheduled {

    @Resource
    private RedissonClient redissonClient;

    private final String upload_lock = "seckill:upload:lock";

    @Resource
    SeckillService seckillService;

    //TODO 幂等性处理
//    @Scheduled(cron = "")
    public void uploadSeckillSkuLatest3Days(){
        //1.重复上架，无需处理
        //关于分布式场景下的幂等性处理
        RLock lock = redissonClient.getLock(upload_lock);
        lock.lock(10, TimeUnit.SECONDS);
        try{
            //关于单机场景下的幂等性处理
            seckillService.uploadSeckillSkuLatest3Days();
        }finally {
            lock.unlock();
        }
    }
}
